package repository

import (
	"github.com/cuiyuanxin/airuisi-admin/pkg/config"
	"github.com/redis/go-redis/v9"
	"go.uber.org/zap"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	gormopentracing "gorm.io/plugin/opentracing"
	"time"
)

type Repository struct {
	Db *gorm.DB
	//rdb    *redis.Client
	Logger *zap.Logger
}

func NewRepository(db *gorm.DB, loger *zap.Logger) *Repository {
	return &Repository{
		Db: db,
		//rdb:    rdb,
		Logger: loger,
	}
}

func NewDBEngine(configSetting *config.Configs) (*gorm.DB, error) {
	var db *gorm.DB
	var err error

	db, err = gorm.Open(mysql.New(mysql.Config{
		DSN:                       configSetting.Database.Mysql.Dsn,
		DefaultStringSize:         256,   // string 类型字段的默认长度
		SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
	}), &gorm.Config{
		SkipDefaultTransaction: true, // 禁用默认事务
		PrepareStmt:            true, // 缓存预编译语句
		NamingStrategy: schema.NamingStrategy{
			TablePrefix:   configSetting.Database.Mysql.Prefix, // 表前缀
			SingularTable: true,                                // 单数表名
			NoLowerCase:   true,                                // 不要小写转换
		},
	})

	if err != nil {
		return nil, err
	}

	// 开发者状态在控制台输出SQL语句
	if configSetting.Server.Mode == "debug" {
		db.Debug()
	}
	db.InstanceSet("gorm:table_options", "ENGINE=InnoDB")

	sqlDB, err := db.DB()
	if err != nil {
		return nil, err
	}
	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(config.DbMaxIdleConns)

	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(config.DbMaxOpenConns)

	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	sqlDB.SetConnMaxLifetime(time.Duration(config.DbConnMaxLifetimeHours) * time.Hour)

	db.Use(gormopentracing.New())

	return db, err

}

func NewRDBClient(configSetting *config.Configs) *redis.Client {
	rdb := redis.NewClient(&redis.Options{
		Addr:     configSetting.Database.Redis.Addr,
		Password: configSetting.Database.Redis.Password, // 没有密码，默认值
		DB:       0,                                     // 默认DB 0
	})

	return rdb
}
